bitkeeper revision 1.1236.1.10 (421da0d32W6mm78NfqVauwQT_ZO1dQ)
authorarun.sharma@intel.com[kaf24] <arun.sharma@intel.com[kaf24]>
Thu, 24 Feb 2005 09:39:31 +0000 (09:39 +0000)
committerarun.sharma@intel.com[kaf24] <arun.sharma@intel.com[kaf24]>
Thu, 24 Feb 2005 09:39:31 +0000 (09:39 +0000)
[PATCH] mmio_addr.patch

Use 1:1 page table to figure out if a particular physical address belongs
to MMIO range or not.

Signed-off-by: Xin B Li <xin.b.li@intel.com>
Signed-off-by: Chengyuan Li <chengyuan.li@intel.com>
Signed-off-by: Arun Sharma <arun.sharma@intel.com>
Index: trunk/tools/libxc/xc_vmx_build.c
===================================================================

tools/libxc/xc_vmx_build.c
xen/arch/x86/vmx.c
xen/include/asm-x86/shadow.h
xen/include/asm-x86/vmx_platform.h

index c286febdf09445118629acd52214a9dadee243f3..3bb4d4fde87d94c189520a9a79ec2f17fabd6e9b 100644 (file)
@@ -108,6 +108,44 @@ static void build_e820map(struct mem_map *mem_mapp, unsigned long mem_size)
     mem_mapp->nr_map = nr_map;
 }
 
+static void zap_mmio_range(int xc_handle, u32 dom,
+                            l2_pgentry_t *vl2tab,
+                            unsigned long mmio_range_start,
+                            unsigned long mmio_range_size)
+{
+    unsigned long mmio_addr;
+    unsigned long mmio_range_end = mmio_range_start + mmio_range_size;
+    unsigned long vl2e;
+    l1_pgentry_t *vl1tab;
+
+    mmio_addr = mmio_range_start & PAGE_MASK;
+    for (; mmio_addr < mmio_range_end; mmio_addr += PAGE_SIZE) {
+        vl2e = vl2tab[l2_table_offset(mmio_addr)];
+        vl1tab = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE,
+                                PROT_READ|PROT_WRITE, vl2e >> PAGE_SHIFT);
+        vl1tab[l1_table_offset(mmio_addr)] = 0;
+        munmap(vl1tab, PAGE_SIZE);
+    }
+}
+
+static void zap_mmio_ranges(int xc_handle, u32 dom,
+                            unsigned long l2tab,
+                            struct mem_map *mem_mapp)
+{
+    int i;
+    l2_pgentry_t *vl2tab = xc_map_foreign_range(xc_handle, dom, PAGE_SIZE,
+                                                PROT_READ|PROT_WRITE,
+                                                l2tab >> PAGE_SHIFT);
+    for (i = 0; i < mem_mapp->nr_map; i++) {
+        if ((mem_mapp->map[i].type == E820_IO)
+          && (mem_mapp->map[i].caching_attr == MEMMAP_UC))
+            zap_mmio_range(xc_handle, dom,
+                            vl2tab, mem_mapp->map[i].addr,
+                            mem_mapp->map[i].size);
+    }
+    munmap(vl2tab, PAGE_SIZE);
+}
+
 static int setup_guest(int xc_handle,
                          u32 dom, int memsize,
                          char *image, unsigned long image_size,
@@ -355,6 +393,7 @@ static int setup_guest(int xc_handle,
 
     /* memsize is in megabytes */
     build_e820map(mem_mapp, memsize << 20);
+    zap_mmio_ranges(xc_handle, dom, l2tab, mem_mapp);
     boot_paramsp->e820_map_nr = mem_mapp->nr_map;
     for (i=0; i<mem_mapp->nr_map; i++) {
         boot_paramsp->e820_map[i].addr = mem_mapp->map[i].addr; 
index 4b47e52c2cd21165ebd14f7444efb89467fd2cef..a30423bab936f087f192236f207bce6b4fd3209c 100644 (file)
@@ -135,6 +135,7 @@ static int vmx_do_page_fault(unsigned long va, struct xen_regs *regs)
             return 0;
     gpa = (gpte & PAGE_MASK) + (va & ~PAGE_MASK);
 
+    /* Use 1:1 page table to identify MMIO address space */
     if (mmio_space(gpa))
         handle_mmio(va, gpa);
 
index f29945142afe3f176461f32c4199fec63a7696ec..191cf3dbe1de47ff062c459b8e438f4205d0ed1f 100644 (file)
@@ -279,7 +279,8 @@ static inline void l1pte_propagate_from_guest(
     unsigned long old_spte = spte;
 #endif
 
-    if ( shadow_mode_external(d) && mmio_space(gpte & 0xFFFFF000) ) {
+    /* Use 1:1 page table to identify MMIO address space */
+    if ( shadow_mode_external(d) && mmio_space(gpte) ) {
         *spte_p = 0;
         return;
     }
index 83cbb59e6f37da778d172cfa6b1913dddd1b3d02..5ecb782c7e0d764585730da7abe33267fb351a38 100644 (file)
@@ -68,8 +68,6 @@ struct instruction {
     __u32   flags; //
 };
 
-#define VGA_SPACE_START   0xA0000
-#define VGA_SPACE_END     0xC0000
 #define MAX_INST_LEN      32
 
 struct mi_per_cpu_info
@@ -89,12 +87,6 @@ struct virutal_platform_def {
 extern void handle_mmio(unsigned long, unsigned long);
 extern int vmx_setup_platform(struct exec_domain *, execution_context_t *);
 
-static inline int mmio_space(unsigned long gpa)
-{
-    if (gpa >= VGA_SPACE_START && gpa < VGA_SPACE_END) {
-        return 1;
-    }
-    return 0;
-}
+#define mmio_space(gpa) (!phys_to_machine_mapping((gpa) >> PAGE_SHIFT))
 
 #endif